package cn.omisheep.au.annotation;

import java.lang.annotation.*;

/**
 * 优先级：
 * 1.controller上的exclude
 * 2.controller上的value
 * 3.method上的exclude
 * 4.method上的value
 * 1、判断role是否在controller的exclude里，如果存在于排除名单，则禁止
 * 2、判断role是否在controller的value里，如果存在则通过，运行访问其中的方法（mapping）
 * 3、判断role是否在method的exclude里，如果存在于排除名单，则禁止
 * 4、判断role是否在method的value里，如果存在则通过
 *
 * @author zhou xin chen  😊
 * 联系方式 qq:1269670415  email:xinchenzhou666@gmail.com
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@AuLimit
public @interface Au {


    /**
     * 该属性只有在方法上生效，如果在方法上定义了Au( open = false )
     * 则如果参数有@AuUser 则AuUser的默认权限将失效
     * 默认打开，如果为false，则该字段永远为 any
     *
     * @return 权限是否打开
     */
    boolean open() default true;


    /**
     * @return 所需要的角色 可以 写在一个字符串中用分隔符隔开，或者分开写
     */
    String[] value() default {};

    /**
     * @return 所排除的角色，优先级大于value
     */
    String[] exclude() default {};

    /**
     * @return 规定时间内(默认10秒) 请求数量大于最大数量，则将该ip禁止。时间默认1天
     */
    String limit() default "10s";

    /**
     * 在规定时间内不能重复请求，否则拉入黑名单(禁止对该接口继续请求)，且在规定时间后释放
     *
     * @return 次数
     */
    int limitMaxCount() default 10;

    /**
     * 在规定时间后释放，默认1小时
     *
     * @return 释放时间
     */
    String relieveTime() default "1h";
}
